package models

import (
	"WeChatwebversion/utils"
	"fmt"
	"log"
	"time"

	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
)

//用户信息结构
type User struct {
	gorm.Model //gin专用包,里面有：
	//ID，create_Time,update_TIme,delect_Time(都是自动添加的修改的)
	UserToken string `json:"usertoken"` //用户通行token
	User_name string `json:"username"`  //用户账号
	User_password            string `json:"userpassword"`//用户密码
	User_image_ulr           string `json:"userimageulr"`//用户头像地址
	User_Identity            string `json:"useridentity"`//用户身份
	Where_the_user_logged_in  string`json:"Wheretheuserloggedin"`//用户登录地址
	User_login_time          string `json:"userlogintime"`//用户登录时间
	Black_list_and_whitelist bool`json:"blacklistandwhitelist"`//黑白名单
}
var DB *gorm.DB



// 定义一个方法程序开始时，
// 初始化数据并且连接数据库拿到数据存放在redis中
func InitializeMYSQL() {
	var err error
	DB, err = gorm.Open(mysql.Open(utils.Mysqldns), &gorm.Config{
		//设置日志输出条件
		Logger: logger.Default.LogMode(logger.Info),
	})

	if err != nil {
		log.Fatalln(err)
	}
	//拿到底层的MySQL连接池DB
	sqldb, err := DB.DB()
	if err != nil {
		log.Fatalln(err)
	}
	//测试是否连接上数据库
	err = sqldb.Ping()
	if err != nil {
		log.Fatalln(err)
	}
	//连接上了设置连接池的设置(默认的设置就可以应用于平常的需求)
	//设置连接池的数量时间等
	sqldb.SetMaxOpenConns(10)
	sqldb.SetMaxIdleConns(10)
	sqldb.SetConnMaxIdleTime(time.Hour)
	sqldb.SetConnMaxLifetime(time.Hour)

	//设置好后顺便创建一个数据表
	DB.AutoMigrate(&UserInformation{})
	fmt.Println("MYSQL配置成功！")

}

// 将新建的用户存入数据库中
func MYSQL_ExtractData(user *UserInformation) (err error) {
	
	//将新的数据存入数据中
	err = DB.Create(user).Error
	if err != nil {
		return err
	}
	return nil
}
//修改用户登录地址
func MYSQL_user_address(username,addres string)  {
	//开启事务
	tx:=DB.Begin()
	if tx.Error !=nil{
		return 
	}
	err:=tx.Model(&UserInformation{}).Where("user_name=?",username).Update("where_the_user_logged_in",addres).Error
	if err!=nil{
		tx.Rollback()
		return
	}
	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return
	}
}
//查询用户基本信息
func FInd_userinformation(username string)( UserInformation, string)  {
	var user UserInformation
	DB.Where("user_name=?",username).Find(&user)
	if user.UserToken=="" {
		return UserInformation{},"数据丢失！"
	}
	return user,""
}
//修改用户昵称
func Edit_MYSQL_UserName(username,useraccountnumber string)error  {
	//开启事务
	tx:=DB.Begin()
	if tx.Error !=nil{
		return tx.Error
	}
	err:=tx.Model(&UserInformation{}).Where("user_name=?",username).Update("user_account_number",useraccountnumber).Error
	if err!=nil{
		tx.Rollback()
		return err
	}
	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return err
	}
	return nil
}
//修改用户昵称
func Edit_MYSQL_UserImage(username,userimageurl string)error  {
	//开启事务
	tx:=DB.Begin()
	if tx.Error !=nil{
		return tx.Error
	}
	err:=tx.Model(&UserInformation{}).Where("user_name=?",username).Update("user_image_ulr",userimageurl).Error
	if err!=nil{
		tx.Rollback()
		return err
	}
	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return err
	}
	return nil
}
//修改用户用户黑白名单管理
func List_User_Roll_call(username string,list bool)error  {
	//开启事务
	tx:=DB.Begin()
	if tx.Error !=nil{
		return tx.Error
	}
	err:=tx.Model(&UserInformation{}).Where("user_name=?",username).Update("black_list_and_whitelist",list).Error
	if err!=nil{
		tx.Rollback()
		return err
	}
	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return err
	}
	return nil
}
//添加修改用户AI提示词
func AI_User_Call_Word(username string,inputvalue string)error  {
	//开启事务
	tx:=DB.Begin()
	if tx.Error !=nil{
		return tx.Error
	}
	err:=tx.Model(&UserInformation{}).Where("user_name=?",username).Update("ai_glossary",inputvalue).Error
	if err!=nil{
		tx.Rollback()
		return err
	}
	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return err
	}
	return nil
}
//注销账号
func User_Cancel_Account(username string)error  {
	//开启事务
	tx:=DB.Begin()
	if tx.Error !=nil{
		return tx.Error
	}
	err:=tx.Where("user_name=?",username).Delete(&UserInformation{}).Error
	if err!=nil{
		tx.Rollback()
		return err
	}
	// 提交事务
	if err := tx.Commit().Error; err != nil {
		return err
	}
	return nil
}